package com.jojo.jojomall.search.Mythread;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author: 魔法少女小夫
 * @Data: 2022/5/19
 * @Version: 测试
 * @Description:
 */
public class ThreadTest2 {
    public static final ExecutorService excutor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Object> future01 = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getId()+ "==>任务一正执");
            int i = 10 / 4;
            System.out.println("运行==>任务一结束，结果为" + i);
            return i;
        }, excutor);
        CompletableFuture<Object> future02 = CompletableFuture.supplyAsync(() ->{
            System.out.println(Thread.currentThread().getId()+ "任务二开始");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("任务二结束");

            return "hello";
        }, excutor);
        /*指定线程运转顺序，并在此期间用后线程执行另一个任务*/
//        future01.runAfterBothAsync(future02,()->{
//            System.out.println(Thread.currentThread().getId()+"任务三开始");
//        },excutor);
//        前两个执行完可获取前两个的返回值用第三个执行
//        future01.thenAcceptBothAsync(future02,(f1,f2)->{
//            System.out.println("f1是"+f1+"f2是"+f2);
//        },excutor);
//        两个执行完成才能执行加入的runnable；且有返回值（任务三）
//        CompletableFuture<String> stringCompletableFuture = future01.thenCombineAsync(future02, (f1, f2) -> {
//            System.out.println("三号任务正再执行!");
//            return f1 + f2 + "niuniu";
//        }, excutor);
//        System.out.println(stringCompletableFuture.get());
        /*runafterEitherAsync  他只要一个结束就会执行run方法  不感知结果，自己也无返回值*/
//        future01.runAfterEitherAsync(future02, () -> {
//            System.out.println("niuniu任务三");
//
//        }, excutor);
//        /*只能感知结果 而且只有一个， 但不能返回值*/
//      future01.acceptEitherAsync(future02,(res)->{
//          System.out.println("结果是"+res);
//      },excutor);
      /*能感知结果，并由任务三的返回值*/
        CompletableFuture<String> stringCompletableFuture = future01.applyToEitherAsync(future02, res -> "任务三", excutor);
        System.out.println(stringCompletableFuture.get());
    }
}
